package service

import (
	"encoding/json"
	"errors"
	"fmt"
	"ginstudydemo.com/main/cache"
	"ginstudydemo.com/main/models"
	"ginstudydemo.com/utils"
	"github.com/redis/go-redis/v9"
)

type IUserService interface {
	StoreUsersInRedis()
	GetUsersFromRedis()
}
type UserService struct{}

func NewUserService() *UserService {
	return &UserService{}
}

// StoreUsersInRedis TODO: 这个方法需要移植到RedisService服务中
// StoreUsersInRedis 将用户记录存储到 Redis
func (u UserService) StoreUsersInRedis(res models.SysUserUsersPageListRes, query models.SysUserUsersPageListParams, pageParams models.PaginationParams) error {

	// 生成  userlist Redis 键
	redisKey := GenerateUserListRedisKey(query, pageParams)
	fmt.Println(redisKey)
	// 将用户记录序列化为 JSON
	resJson, err := json.Marshal(res)
	if err != nil {
		return err
	}
	fmt.Println(resJson)

	// 存储到 Redis，设置一个过期时间，比如 1 小时
	err = cache.Rdb.Set(cache.Rctx, redisKey, resJson, 0).Err()
	if err != nil {
		return err
	}
	fmt.Println("redis中存储数据")
	return nil
}

// GetUsersFromRedis TODO: 这个方法需要移植到RedisService服务中
// GetUsersFromRedis 从 Redis 中读取用户记录
func (u UserService) GetUsersFromRedis(query models.SysUserUsersPageListParams, pageParams models.PaginationParams) (models.SysUserUsersPageListRes, error) {
	var res models.SysUserUsersPageListRes

	// 生成  userlist Redis 键
	redisKey := GenerateUserListRedisKey(query, pageParams)

	// 从 Redis 中获取用户记录
	resJson, err := cache.Rdb.Get(cache.Rctx, redisKey).Result()
	if errors.Is(err, redis.Nil) {
		// Redis 中没有数据
		return res, nil
	} else if err != nil {
		// 其他错误
		return res, err
	}

	// 将 JSON 反序列化为用户记录
	err = json.Unmarshal([]byte(resJson), &res)
	if err != nil {
		return res, err
	}
	fmt.Println("redis中读取的数据")
	return res, nil
}

// GenerateUserListRedisKey 将查询参数和分页参数序列化为 Redis 键
func GenerateUserListRedisKey(query models.SysUserUsersPageListParams, pageParams models.PaginationParams) string {
	queryString := utils.StructToQueryString(&query)
	pageString := utils.StructToQueryString(&pageParams)
	return "user_list:" + queryString + ":" + pageString
}
